signed char x, a;			// Объявление переменных x и a, как символьных
// со знаком
unsigned char y, b;	// Объявление переменных y и b, как символьных
// без знака

void main(void)
{
x=0xFF; 
/* Поскольку переменная x имеет тип signed char (символьное со
   знаком), то компилятор интерпретирует ее значение (0xFF = 
   0b 1111 1111), как -1, т.к. 1 в самом старшем разряде означает "-",
   а остальные семь единиц в дополнительном коде означают 1 */
y=0xFF; 
/* Т.к. переменная y имеет тип unsigned char (символьное без знака), 
   то компилятор интерпретирует ее значение (0xFF=0b 1111 1111), 
   как 255, т.к. все 1 являются частью числа */
a=x+y;  
b=x+y; 
/* В обоих случаях вычисляется сумма: 0b 1111 1111 + 0b 1111 1111 =
   0b 1 1111 1110. Единица в самом старшем разряде пропадает, т.к. под
   переменную типа char (как signed, так и unsigned) в памяти
   отводится 8 бит (1 байт). Таким образом, в обоих случаях результат
   сложения: 0b 1111 1110, но компилятором он интерпретируется 
   по-разному. 
   Поскольку переменная a имеет тип signed char (символьное со
   знаком), то компилятор интерпретирует ее значение, как -2, т.к. 1 в
   самом старшем разряде означает "-", а остальные семь разрядов в
   дополнительном коде означают 2.
   Поскольку  переменная b имеет тип unsigned char (символьное без
   знака), то компилятор интерпретирует ее значение, как 254, т.к. все
   разряды являются частью числа 
   Таким образом, после выполнения функции main:
   x=-1, y=255, a=-2, b=254 */
}
